/*********************************************************************************************************************
 * COPYRIGHT NOTICE
 * Copyright (c) 2018,逐飞科技
 * All rights reserved.
 * 技术讨论QQ群：	一群：179029047(已满)
 *					二群：244861897(已满)
 *					三群：824575535
 *
 * 以下所有内容版权均属逐飞科技所有，未经允许不得用于商业用途，
 * 欢迎各位使用并传播本程序，修改内容时必须保留逐飞科技的版权声明。
 *
 * @file			zf_iic.h
 * @company			成都逐飞科技有限公司
 * @author			逐飞科技(QQ3184284598)
 * @version			查看doc内version文件 版本说明
 * @Software		IAR 8.3 or MDK 5.24
 * @Taobao			https://seekfree.taobao.com/
 * @date			2020-03-25
 * @note			本文件作为 LPC55S 系列芯片开源库外设文件
					提供 iic 驱动
 ********************************************************************************************************************/
#ifndef _ZF_IIC_H_
#define _ZF_IIC_H_

#include "zf_flexcomm.h"

// *********************************************************** Param define *********************************************************** start
// ========== IIC MASTER 参数对应选项 ==========
typedef enum
{
	IIC_MASTER_PARAM_MASTER_ENABLE = 0x00,									// 使能 IIC
	IIC_MASTER_PARAM_BAUD_RATE,												// 波特率设置
	IIC_MASTER_PARAM_TIMEOUT_ENABLE,										// 超时处理使能
}iic_master_param_list;
// ========== IIC MASTER 参数对应选项 ==========

// ========== IIC SLAVE 参数对应选项 ==========
typedef enum
{
	IIC_SLAVE_PARAM_ADDRESS_0 = 0x00,										// 地址 0 值
	IIC_SLAVE_PARAM_ADDRESS_0_MASK,											// 地址 0 屏蔽
	IIC_SLAVE_PARAM_ADDRESS_1,												// 地址 1 值
	IIC_SLAVE_PARAM_ADDRESS_1_MASK,											// 地址 1 屏蔽
	IIC_SLAVE_PARAM_ADDRESS_2,												// 地址 2 值
	IIC_SLAVE_PARAM_ADDRESS_2_MASK,											// 地址 2 屏蔽
	IIC_SLAVE_PARAM_ADDRESS_3,												// 地址 3 值
	IIC_SLAVE_PARAM_ADDRESS_3_MASK,											// 地址 3 屏蔽
	IIC_SLAVE_PARAM_QUAL_MODE,												// 从机地址 0 限定模式
	IIC_SLAVE_PARAM_QUAL_ADDRESS,											// 从机地址 0 限定
	IIC_SLAVE_PARAM_SPEED_MODE,												// IIC 速率模式
	IIC_SLAVE_PARAM_SLAVE_ENABLE,											// 使能 IIC
}iic_slave_param_list;
// ========== IIC SLAVE 参数对应选项 ==========

// ========== IIC MASTER TRANSFER 对应选项 ==========
typedef enum
{
	IIC_TRANSFER_PARAM_TRANSFER_FLAG = 0x00,								// 发送信号
	IIC_TRANSFER_PARAM_SLAVE_ADDRESS,										// 从机地址
	IIC_TRANSFER_PARAM_DATA_DIR,											// 数据方向
	IIC_TRANSFER_PARAM_SUB_ADDRESS,											// 子地址
	IIC_TRANSFER_PARAM_SUBADD_SIZE,											// 子地址大小
	IIC_TRANSFER_PARAM_DATA_BUFFER,											// 数据缓冲区
	IIC_TRANSFER_PARAM_DATA_LEN,											// 数据长度
}iic_master_transfer_param_list;
// ========== IIC MASTER TRANSFER 对应选项 ==========

// ========== IIC MASTER TRANSFER 标志选项 ==========
typedef enum
{
	IIC_TRANSFER_FLAG_DEFAULT = 0x00,										// 传输默认
	IIC_TRANSFER_FLAG_NO_START = 0x01,										// 无起始
	IIC_TRANSFER_FLAG_RESTART = 0x02,										// restart 信号
	IIC_TRANSFER_FLAG_NO_STOP = 0x04,										// 无停止
}iic_transfer_flag_list;
// ========== IIC MASTER TRANSFER 标志选项 ==========

// ========== IIC MASTER TRANSFER 方向选项 ==========
typedef enum
{
	IIC_TRANSFER_DIR_WRITE = 0x00,											// 写
	IIC_TRANSFER_DIR_READ,													// 读
}iic_transfer_dir_list;
// ========== IIC MASTER TRANSFER 方向选项 ==========

// ========== IIC SLAVE 地址限定模式选项 ==========
typedef enum
{
	IIC_QUAL_MODE_MASK = 0x00,
	IIC_QUAL_MODE_EXTEND,
}iic_qual_mode_list;
// ========== IIC SLAVE 地址限定模式选项 ==========

// ========== IIC SLAVE 速率模式选项 ==========
typedef enum
{
	IIC_SPEED_MODE_STANDAR = 0x00,
	IIC_SPEED_MODE_FAST,
	IIC_SPEED_MODE_FAST_PLUS,
	IIC_SPEED_MODE_HIGH_SPEED,
}iic_speed_mode_list;
// ========== IIC SLAVE 速率模式选项 ==========
// *********************************************************** Param define *********************************************************** end

extern i2c_master_handle_t g_iic_master_transfer_handle[8];
extern i2c_slave_handle_t g_iic_slave_transfer_handle[8];

// ******************************************************** Function statement ******************************************************** start

//=================== Flex COMM IIC config ===================
void zf_iic_master_get_default_config (i2c_master_config_t *config);
void zf_iic_master_param_set  (i2c_master_config_t *config, iic_master_param_list param_index, uint32_t data);
void zf_iic_master_get_default_transfer_config (i2c_master_transfer_t *config);
void zf_iic_master_transfer_param_set  (i2c_master_transfer_t *config, iic_master_transfer_param_list param_index, uint32_t data);
void zf_iic_master_transfer_buffer_set (i2c_master_transfer_t *config, void *data);
void zf_iic_slave_get_default_config (i2c_slave_config_t *config);
void zf_iic_slave_param_set  (i2c_slave_config_t *config, iic_slave_param_list param_index, uint8_t data);
//=================== Flex COMM IIC config ===================

//=================== Flex COMM IIC function ===================
void zf_iic_master_transfer_great_handle (flexcomm_index_list index, i2c_master_transfer_callback_t callback);
void zf_iic_slave_transfer_great_handle (flexcomm_index_list index, i2c_slave_transfer_callback_t callback);
uint32_t zf_iic_master_transfer_non_blocking (flexcomm_index_list index, i2c_master_transfer_t *config);
uint32_t zf_iic_slave_transfer_non_blocking (flexcomm_index_list index, uint32_t eventMask);
uint8_t zf_iic_master_send_data (flexcomm_index_list index, uint8_t address, uint8_t *data, size_t datalen);
uint8_t zf_iic_master_receive_data (flexcomm_index_list index, uint8_t address, uint8_t *data, size_t datalen);
uint8_t zf_iic_slave_send_data (flexcomm_index_list index, uint8_t *data, size_t datalen);
uint8_t zf_iic_slave_receive_data (flexcomm_index_list index, uint8_t *data, size_t datalen);
uint8_t zf_iic_master_start_read (flexcomm_index_list index, uint8_t address);
uint8_t zf_iic_master_start_write (flexcomm_index_list index, uint8_t address);
uint8_t zf_iic_master_stop (flexcomm_index_list index);
//=================== Flex COMM IIC function ===================

//=================== Flex COMM IIC periopheral function ===================
void zf_iic_write_reg (flexcomm_index_list index, uint8_t add, uint8_t reg, uint8_t data);
void zf_iic_read_reg (flexcomm_index_list index, uint8_t add, uint8_t reg, uint8_t *data, uint8_t datalen);
//=================== Flex COMM IIC periopheral function ===================

// ******************************************************** Function statement ******************************************************** end

#endif
